for devclass in XendDevices.valid_devices():
self.getDeviceController(devclass).waitForDevices()
- def destroyDevice(self, deviceClass, devid):
+ def destroyDevice(self, deviceClass, devid, force=None):
try:
devid = int(devid)
except ValueError:
devid = entry
break
- return self.getDeviceController(deviceClass).destroyDevice(devid)
+ return self.getDeviceController(deviceClass).destroyDevice(devid, force)
raise VmError('%s devices may not be reconfigured' % self.deviceClass)
- def destroyDevice(self, devid):
+ def destroyDevice(self, devid, force):
"""Destroy the specified device.
@param devid The device ID, or something device-specific from which
self.writeBackend(devid, 'online', "0")
self.writeBackend(devid, 'state', str(xenbusState['Closing']))
+ if force:
+ frontpath = self.frontendPath(devid)
+ backpath = xstransact.Read(frontpath, "backend")
+ if backpath:
+ xstransact.Remove(backpath)
+ xstransact.Remove(frontpath)
+
def configurations(self):
return map(self.configuration, self.deviceIDs())
return config
- def destroyDevice(self, devid):
+ def destroyDevice(self, devid, force):
"""@see DevController.destroyDevice"""
# If we are given a device name, then look up the device ID from it,
# superclass's method.
try:
- DevController.destroyDevice(self, int(devid))
+ DevController.destroyDevice(self, int(devid), force)
except ValueError:
devid_end = type(devid) is str and devid.split('/')[-1] or None
for i in self.deviceIDs():
d = self.readBackend(i, 'dev')
if d == devid or (devid_end and d == devid_end):
- DevController.destroyDevice(self, i)
+ DevController.destroyDevice(self, i, force)
return
raise VmError("Device %s not connected" % devid)
'Create a new virtual block device.'),
'block-configure': ('<Domain> <BackDev> <FrontDev> <Mode> [BackDomain]',
'Change block device configuration'),
- 'block-detach' : ('<Domain> <DevId>',
+ 'block-detach' : ('<Domain> <DevId> [-f|--force]',
'Destroy a domain\'s virtual block device.'),
'block-list' : ('<Domain> [--long]',
'List virtual block devices for a domain.'),
'network-attach': ('<Domain> [--script=<script>] [--ip=<ip>] '
'[--mac=<mac>]',
'Create a new virtual network device.'),
- 'network-detach': ('<Domain> <DevId>',
+ 'network-detach': ('<Domain> <DevId> [-f|--force]',
'Destroy a domain\'s virtual network device.'),
'network-list' : ('<Domain> [--long]',
'List virtual network interfaces for a domain.'),
def detach(args, command, deviceClass):
- arg_check(args, command, 2)
+ arg_check(args, command, 2, 3)
dom = args[0]
dev = args[1]
-
- server.xend.domain.destroyDevice(dom, deviceClass, dev)
+ try:
+ force = args[2]
+ if (force != "--force") and (force != "-f"):
+ print "Ignoring option %s"%(force)
+ force = None
+ except IndexError:
+ force = None
+
+ server.xend.domain.destroyDevice(dom, deviceClass, dev, force)
def xm_block_detach(args):